package com.elguile.laptop.casoDeUso;



import com.elguile.laptop.baseDatos.RepositorioVenta;

import com.elguile.laptop.entidades.Linea;
import com.elguile.laptop.entidades.Reloj;

import com.elguile.laptop.entidades.Venta;
import com.elguile.laptop.errores.ExcepcionesDeSuficienteLineas;
import com.elguile.laptop.errores.ExepcionDeTextoVacio;

/**
 * 
 * @author Esta clase representa el caso de uso de registrar una venta un
 *         ejemplo de como usarla en producion
 * 
 *         RegistroDeVenta registroDeVenta
 *         =RegistroDeVenta.getRegistroDeVenta(); registroDeVenta.agrega(new
 *         Linea(1, "limpieza del teclado", BigDecimal.ONE));
 *         registroDeVenta.registrar();
 * 
 * 
 */
public class RegistroDeVenta implements CasoDeUso {

	private final RepositorioVenta repositorioVenta;
	private final Venta venta;
	private final Reloj reloj;

	public RegistroDeVenta(RepositorioVenta repositorioVenta, Venta venta,
			Reloj reloj) {
		this.repositorioVenta = repositorioVenta;
		this.venta = venta;
		this.reloj = reloj;
	}

	public RegistroDeVenta(RepositorioVenta repositorioVenta, Reloj reloj) {
		this(repositorioVenta, new Venta(), reloj);
	}

	public void limpiar() {
		venta.setCodigoVenta(null);
		venta.setFecha(null);
		venta.limpiarLineas();
	}

	public void agrega(Linea linea) {
		if (!laLineasTieneDescripcion(linea)) {
			throw new ExepcionDeTextoVacio(
					"las descripciones de las lineas no pueden estar vacias");
		}
		venta.add(linea);

	}

	public void registrar() {
		if (!tieneSuficientesLineas())
			throw new ExcepcionesDeSuficienteLineas(
					"no tiene suficiente lineas no se realiso la inserscion");
		venta.setFecha(reloj.getHora());
		repositorioVenta.guarda(venta);

	}

	private boolean laLineasTieneDescripcion(Linea linea) {
		if ("".equals(linea.getDescripcion()))
			return false;
		if (linea.getDescripcion() == null)
			return false;
		return true;

	}

	public boolean tieneSuficientesLineas() {
		return venta.getCantidadLineas() != 0;
	}

	public Venta getVenta() {
		return new Venta(venta);
	}
}
